#include "TabBonus.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>


void initTabBonus (TabBonus* ptab_pbonus)
{
      assert (ptab_pbonus!=NULL);
      ptab_pbonus->ptab_bonus=NULL;
      ptab_pbonus->nbre_bonus=0;
}

TabBonus* creerTabBonus ()
{
      TabBonus* ptab_pbonus= (TabBonus*) malloc(sizeof(TabBonus));
      initTabBonus(ptab_pbonus);
      return ptab_pbonus;
}

void libereTabBonus (TabBonus* ptab_pbonus)
{
      assert (ptab_pbonus!=NULL);
      while (ptab_pbonus->nbre_bonus > 0)
      {
		free (ptab_pbonus->ptab_bonus[ptab_pbonus->nbre_bonus-1]);
		ptab_pbonus->ptab_bonus[ptab_pbonus->nbre_bonus-1] = NULL;
		ptab_pbonus->nbre_bonus--;
      }
      ptab_pbonus->nbre_bonus=0;
    
}

void detruireTabBonus (TabBonus** pptab_bonus)
{
      assert (pptab_bonus!=NULL && *pptab_bonus!=NULL);
      libereTabBonus (*pptab_bonus);
      free (*pptab_bonus);
      *pptab_bonus=NULL;
}

const int getNbreBonusTabBonus (const TabBonus* ptab_pbonus)
{
	assert (ptab_pbonus != NULL);
	return ptab_pbonus->nbre_bonus;
}

void setNbreBonusTabBonus (TabBonus* ptab_pbonus, const int nbre)
{
	assert (ptab_pbonus != NULL);
	assert (nbre >= 0);
        ptab_pbonus->nbre_bonus = nbre;
}

Bonus** get_ptab_bonusTabBonus (const TabBonus* ptab_pbonus)
{
	assert (ptab_pbonus != NULL);
	return ptab_pbonus->ptab_bonus;
}

Bonus* getBonusTabBonus (const TabBonus* ptab_pbonus, const int i_bonus)
{
	assert (ptab_pbonus != NULL);
	assert (i_bonus >= 0);
	return ptab_pbonus->ptab_bonus[i_bonus];
}

void setBonusTabBonus (TabBonus* ptab_pbonus, const int i_bonus, Bonus* nouveau_bonus)
{
	assert (ptab_pbonus != NULL);
	assert (i_bonus >= 0);
	ptab_pbonus->ptab_bonus[i_bonus] = nouveau_bonus;
}
  
void ajouterBonus (TabBonus* ptab_pbonus, Bonus* pbonus)
{ 
      assert (ptab_pbonus!=NULL && pbonus!=NULL);
      if (ptab_pbonus->ptab_bonus==NULL)
	  {
		ptab_pbonus->ptab_bonus=(Bonus**)malloc(sizeof(pbonus));
		ptab_pbonus->ptab_bonus[0]=pbonus;
		ptab_pbonus->nbre_bonus=1;
	  }
      else
	  {
	   
	   TabBonus* ptab_pbonus_temp=creerTabBonus ();
	   
	   ptab_pbonus_temp->ptab_bonus=(Bonus**)malloc(sizeof(pbonus)*(ptab_pbonus->nbre_bonus+1));
	   int i;
	   for (i=0;i<ptab_pbonus->nbre_bonus;i++)
		ptab_pbonus_temp->ptab_bonus[i]=ptab_pbonus->ptab_bonus[i];
	  ptab_pbonus_temp->ptab_bonus[i]=pbonus;
	  ptab_pbonus->nbre_bonus++;
	  free (ptab_pbonus->ptab_bonus);
	  ptab_pbonus->ptab_bonus=ptab_pbonus_temp->ptab_bonus;
	  }
}


/*void supprimerEnnemi (TabEnnemis* ptab_pennemis, Ennemi* pennemi)
{
	int j = 0;
	  if (ptab_pennemis->nbre_ennemis>0)
	  {
	      TabEnnemis* ptab_pennemis_temp=creerTabEnnemis ();
	   
	      ptab_pennemis_temp->ptab_ennemis=(Ennemi**)malloc(sizeof(pennemi)*(ptab_pennemis->nbre_ennemis-1));
	      int i;
	      for (i=0;i<ptab_pennemis->nbre_ennemis;i++)
		{
			if (ptab_pennemis->ptab_ennemis[i]!=pennemi)
			{
				ptab_pennemis_temp->ptab_ennemis[j]=ptab_pennemis->ptab_ennemis[i];
				j++;
			}
		}
		    
	      ptab_pennemis->nbre_ennemis--;
	      free (ptab_pennemis->ptab_ennemis);
	      ptab_pennemis->ptab_ennemis=ptab_pennemis_temp->ptab_ennemis;
	  }
}*/

/*void supprimerBonus (TabBonus* ptab_pbonus, Bonus* pbonus)
{
	      int i;
	      if (ptab_pbonus->nbre_bonus>1)
	      {
	      for (i=0;i<ptab_pbonus->nbre_bonus;i++)
		{
			if (ptab_pbonus->ptab_bonus[i]==pbonus)
			{
				detruireBonus(&(ptab_pbonus->ptab_bonus[i]));
				ptab_pbonus->ptab_bonus[i]=ptab_pbonus->ptab_bonus[ptab_pbonus->nbre_bonus-1];
				ptab_pbonus->nbre_bonus--;
			}
		}
	      }
	      else if (ptab_pbonus->nbre_bonus==1)
		    if (ptab_pbonus->ptab_bonus[0]==pbonus)
			ptab_pbonus->nbre_bonus=0;

}*/

void supprimerBonus (TabBonus* ptab_pbonus, Bonus* pbonus)
{
	int i;
	
	 if (ptab_pbonus->nbre_bonus>1)
	 {
		for (i=0;i<ptab_pbonus->nbre_bonus;i++)
		{
			if (ptab_pbonus->ptab_bonus[i]==pbonus)
			{
				ptab_pbonus->ptab_bonus[i]=ptab_pbonus->ptab_bonus[ptab_pbonus->nbre_bonus-1];
				ptab_pbonus->nbre_bonus--;
			}
		 }
	 }
	 else if (ptab_pbonus->nbre_bonus==1)
		if (ptab_pbonus->ptab_bonus[0]==pbonus)
		    ptab_pbonus->nbre_bonus--;
}

/** @brief Cette procedure permet de tester toutes les fonctions du module
 */
void testRegressionTabBonus ()
{	
	printf("Passons au test de regression du module TabBonus\n\n");
	Point* ppt1;
	Point* ppt2;
	printf ("on va creer des points\n\n");
	ppt1=creerPoint (1.2, 2.2);
	ppt2=creerPoint (2.5, 3.5);
	printf ("on va creer une trajectoire\n\n");
	Trajectoire* ptraj;
	ptraj=creerTrajectoire (ppt1, ppt2, 2.00);
	Ennemi* pmechant;
	pmechant=creerEnnemi (2, 5.75, 10.25, ptraj);
	printf("Passons a la creation des Bonus\n\n");
      	Bonus* pbonus=creerBonus (pmechant);
      	Bonus* pbonus2=creerBonus (pmechant);
	Bonus* pbonus3=creerBonus (pmechant);
	Bonus* pbonus4=creerBonus (pmechant);
      
	printf("Passons a la creation du tableau  de bonus\n\n");
      	TabBonus* ptableau_bonus=creerTabBonus ();
      	printf("le tableau de bonus a pour adresse %p et le bonus %p et le nbre %d\n\n"
      	,ptableau_bonus,pbonus,ptableau_bonus->nbre_bonus);
      	
	ajouterBonus (ptableau_bonus, pbonus);
	printf("le bonus du tabeau a pour valeur 0 puis 5.75 et 10.25 verifions %d, %f et %f \n\n",
	     ptableau_bonus->ptab_bonus[0]->est_bonus_arme,
	     ptableau_bonus->ptab_bonus[0]->posX_bonus,
	      ptableau_bonus->ptab_bonus[0]->posY_bonus);
      
	ajouterBonus (ptableau_bonus, pbonus2);
	printf("le bonus du tabeau a pour valeur 0 puis 5.75 et 10.25 verifions %d, %f et %f \n\n",
	     ptableau_bonus->ptab_bonus[1]->est_bonus_arme,
	     ptableau_bonus->ptab_bonus[1]->posX_bonus,
	     ptableau_bonus->ptab_bonus[1]->posY_bonus);
	
	ajouterBonus (ptableau_bonus, pbonus3);
	printf("le bonus du tabeau a pour valeur 0 puis 5.75 et 10.25 verifions %d, %f et %f \n\n",
	     ptableau_bonus->ptab_bonus[2]->est_bonus_arme,
	     ptableau_bonus->ptab_bonus[2]->posX_bonus,
	     ptableau_bonus->ptab_bonus[2]->posY_bonus);
      
	ajouterBonus (ptableau_bonus, pbonus4);
	printf("le bonus du tabeau a pour valeur 0 puis 5.75 et 10.25 verifions %d, %f et %f \n\n",
	     ptableau_bonus->ptab_bonus[3]->est_bonus_arme,
	     ptableau_bonus->ptab_bonus[3]->posX_bonus,
	     ptableau_bonus->ptab_bonus[3]->posY_bonus);
	
	supprimerBonus (ptableau_bonus, ptableau_bonus->ptab_bonus[3]);
	printf("le nbre de bonus estas %d\n\n",ptableau_bonus->nbre_bonus);
	printf("l'ennemi3 du tabeau a pour valeur 0 puis 5.75 verifions %d, %f\n\n",
	     ptableau_bonus->ptab_bonus[2]->est_bonus_arme,
	     ptableau_bonus->ptab_bonus[2]->posX_bonus);
	    
	
	supprimerBonus (ptableau_bonus, ptableau_bonus->ptab_bonus[0]);
	printf("le nbre de bonus esta %d\n\n",ptableau_bonus->nbre_bonus);
	printf("l'ennemi0 du tabeau a pour valeur 0 puis 5.75 verifions %d, %f\n\n",
	     ptableau_bonus->ptab_bonus[0]->est_bonus_arme,
	     ptableau_bonus->ptab_bonus[0]->posX_bonus);
	   
	supprimerBonus (ptableau_bonus, ptableau_bonus->ptab_bonus[0]);
	printf("le nbre de bonus estaS %d\n\n",ptableau_bonus->nbre_bonus);
	printf("l'ennemi0 du tabeau a pour valeur 0 puis 5.75 verifions %d, %f\n\n",
	     ptableau_bonus->ptab_bonus[0]->est_bonus_arme,
	     ptableau_bonus->ptab_bonus[0]->posX_bonus);
	    
    
	supprimerBonus (ptableau_bonus, ptableau_bonus->ptab_bonus[0]);
	printf("le nbre de bonus est %d\n\n",ptableau_bonus->nbre_bonus);
	
	printf("Fin du test de regression du module TabBonus\n\n");     
}
